#include <atomic>
#include <iostream>
#include <thread>

std::atomic_flag flagA = ATOMIC_FLAG_INIT; // 控制打印A的线程
std::atomic_flag flagB = ATOMIC_FLAG_INIT; // 控制打印B的线程

void printA(int n)
{
    for (int i = 0; i < n; ++i) {
        // 自旋等待 flagA 可以清除
        while (flagA.test_and_set()) {
            ; // 等待B线程释放
        }
        std::cout << "A" << std::flush;
        flagB.clear(); // 释放B线程
    }
}

void printB(int n)
{
    for (int i = 0; i < n; ++i) {
        // 自旋等待 flagB 可以清除
        while (flagB.test_and_set()) {
            ; // 等待A线程释放
        }
        std::cout << "B" << std::flush;
        flagA.clear(); // 释放A线程
    }
}

int main()
{
    int n = 10;

    // 初始化flagA，让A线程先打印
    flagA.clear();
    flagB.test_and_set(); // B线程先自旋等待

    std::thread t1(printA, n);
    std::thread t2(printB, n);

    t1.join();
    t2.join();

    std::cout << std::endl;
    return 0;
}
